﻿using System;
using System.Collections.Generic;

using System.Text;

namespace Rance.Battle
{
    class 炮兵AI : AI
    {
        public override AIResult Excute(角色 角色, 队伍状况 队伍状况, AI技能MGT 技能mgt)
        {
            AIResult result = new AIResult();
            //2点行动力的技能都是2X2的
            if (角色.行动点 >= 2)
            {
                var 技能list = 技能mgt.GetBy行动点(2);
                if (技能list.Count == 1)
                {
                    result.Action = 技能list[0].Name;
                    var target = get2X2Target(技能list[0].TargetList, 队伍状况);
                    if (target != null)
                    {
                        result.TargetList = target;
                        return result;
                    }
                }
                else if (技能list.Count > 1)
                {
                    var value = 队伍状况.战场.AI乱数表.Random(0, 技能list.Count);

                    result.Action = 技能list[value].Name;
                    var target = get2X2Target(技能list[value].TargetList, 队伍状况);
                    if (target != null)
                    {
                        result.TargetList = target;
                        return result;
                    }
                }
            }

            //选择炮击
            var 炮击 = 技能mgt.Get("炮击");
            if (炮击 == null)
                return null;
            var 炮击target = getTarget(ConvertSoloTarget(炮击.TargetList), 队伍状况);
            result.Action = 炮击.Name;
            result.TargetList.Add(炮击target);

            return result;
        }

        private 角色 getTarget(List<角色> targetList, 队伍状况 队伍状况)
        {
            //优先攻击"准备中"的敌人
            List<角色> tempList = targetList.FindAll(r => r.是否准备);
            if (tempList.Count == 1)
                return targetList[0];
            else if (tempList.Count > 1)
            {
                var value = 队伍状况.战场.AI乱数表.Random(0, tempList.Count);
                return tempList[value];
            }

            //撇除"步卒"敌人
            tempList.Clear();
            foreach (var item in targetList)
            {
                if (item.兵种.类型 == "步卒")
                    continue;

                tempList.Add(item);
            }

            if (tempList.Count != 0)
                targetList = tempList;

            if (targetList.Count == 1)
                return targetList[0];
            else
            {
                var value = 队伍状况.战场.AI乱数表.Random(0, targetList.Count);
                return targetList[value];
            }
        }

        private List<角色> get2X2Target(List<AI技能目标> list, 队伍状况 队伍状况)
        {
            var result = list.Exists(r => r.List.Count >= 3);
            if (!result)
                return null;

            if (list.Count == 1)
            {
                return list[0].List;
            }
            //只有最多两种可能
            else
            {
                //优先攻击准备中的敌人
                bool has准备1 = list[0].List.Exists(r => r.是否准备);
                bool has准备2 = list[1].List.Exists(r => r.是否准备);
                if (has准备1 && !has准备2)
                    return list[0].List;
                if (!has准备1 && has准备2)
                    return list[1].List;

                //优先打目标多的
                if (list[0].List.Count > list[1].List.Count)
                    return list[0].List;
                else if (list[0].List.Count < list[1].List.Count)
                    return list[1].List;

                //优先打盾少的
                var 步卒数量1 = list[0].List.FindAll(r => r.兵种.类型 == "步卒").Count;

                var 步卒数量2 = list[1].List.FindAll(r => r.兵种.类型 == "步卒").Count;

                if(步卒数量1 > 步卒数量2)
                    return list[0].List;
                else if(步卒数量1 < 步卒数量2)
                    return list[1].List;

                //攻击血最少的目标
                var tempList = 队伍状况.对手状态.队伍.成员List.FindAll(r => !r.是否败退);
                tempList.Sort((v1,v2) => v1.兵力.CompareTo(v2.兵力));
                              
                foreach (var item in tempList)
                { 
                    if(list[0].List.Contains(item) &&
                       !list[1].List.Contains(item))
                        return list[0].List;

                    if (!list[0].List.Contains(item) &&
                       list[1].List.Contains(item))
                        return list[1].List;
                }

                //这种情况应该不会出现
                throw new Exception();
            }
        }

        private static 炮兵AI instance = new 炮兵AI();
        public static 炮兵AI GetInstance()
        {
            return instance;
        }
    }
}
